package com.chuxing.system.controller;

import cn.dev33.satoken.stp.StpUtil;
import com.chuxing.config.PermissionsState;
import com.chuxing.config.SecurityRole;
import com.chuxing.domain.ClassInfo;
import com.chuxing.domain.DTO.TGroupsListDTO;
import com.chuxing.domain.Result;
import com.chuxing.domain.TGroups;
import com.chuxing.domain.VO.PageResultVO;
import com.chuxing.exception.GenericException;
import com.chuxing.exception.UnauthorizedException;
import com.chuxing.security.service.UserService;
import com.chuxing.system.mapper.ClassinfoMapper;
import com.chuxing.system.service.ITGroupsService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * 小组Controller
 * 
 * @author 刘祺
 * @date 2025-01-11
 */
@RestController
@RequestMapping("/system/groups")
@Tag(name = "小组管理", description = "小组管理")
@Slf4j
@RequiredArgsConstructor
public class TGroupsController
{
    private final ITGroupsService tGroupsService;
    private final UserService userService;
    private final ClassinfoMapper classinfoMapper;

    /**
     * 查询小组列表
     */
    @GetMapping("/list")
    @Operation(summary = "管理员查询小组列表", description = "管理员查询小组列表")
    public Result<PageResultVO> list(TGroupsListDTO tGroupsListDTO)
    {
        log.info("查询小组列表{}", tGroupsListDTO);
        // 检查用户是否已登录
        if (!StpUtil.isLogin()) {
            throw new UnauthorizedException(PermissionsState.NOT_LOGIN);
        }
        // 检查用户是否具有管理员角色
        if (!StpUtil.hasRole(SecurityRole.ROLE_ADMIN)) {
            throw new GenericException(PermissionsState.PERMISSION_NOT_ENOUGH);
        }
        PageResultVO list = tGroupsService.selectTGroupsList(tGroupsListDTO);
        return Result.success( "获取小组列表信息成功", list);
    }

    /**
     * 导出小组列表
     */
//    @Log(title = "小组", businessType = BusinessType.EXPORT)
//    @PostMapping("/export")
//    public void export(HttpServletResponse response, TGroups tGroups)
//    {
//        List<TGroups> list = tGroupsService.selectTGroupsList(tGroups);
//        ExcelUtil<TGroups> util = new ExcelUtil<TGroups>(TGroups.class);
//        util.exportExcel(response, list, "小组数据");
//    }

    /**
     * 获取小组详细信息
     */
    @GetMapping(value = "/{groupID}")
    @Operation(summary = "管理员获取小组详细信息", description = "管理员获取小组详细信息")
    public Result<TGroups> getInfo(@PathVariable("groupID") Long groupID)
    {
        log.info("管理员获取小组详细信息，参数为：{}", groupID);
        // 检查用户是否已登录
        if (!StpUtil.isLogin()) {
            throw new UnauthorizedException(PermissionsState.NOT_LOGIN);
        }
        // 检查用户是否具有管理员角色
        if (!StpUtil.hasRole(SecurityRole.ROLE_ADMIN)) {
            throw new GenericException(PermissionsState.PERMISSION_NOT_ENOUGH);
        }
        TGroups tGroups = tGroupsService.selectTGroupsByGroupID(groupID);
        return Result.success( "获取小组信息成功",tGroups);
    }

    /**
     * 新增小组
     */
    @PostMapping
    @Operation(summary = "管理员新增小组", description = "管理员新增小组")
    public Result<Object> add(@RequestBody TGroups tGroups)
    {
        log.info("管理员新增小组{}", tGroups);
        // 检查用户是否已登录
        if (!StpUtil.isLogin()) {
            throw new UnauthorizedException(PermissionsState.NOT_LOGIN);
        }
        // 检查用户是否具有管理员角色
        if (!StpUtil.hasRole(SecurityRole.ROLE_ADMIN)) {
            throw new GenericException(PermissionsState.PERMISSION_NOT_ENOUGH);
        }
        tGroupsService.insertTGroups(tGroups);
        return Result.success( "新增小组成功");
    }

    /**
     * 修改小组
     */
    @PutMapping
    @Operation(summary = "管理员修改小组", description = "管理员修改小组")
    public Result<Object> edit(@RequestBody TGroups tGroups)
    {
        log.info("管理员修改小组{}", tGroups);
        // 检查用户是否已登录
        if (!StpUtil.isLogin()) {
            throw new UnauthorizedException(PermissionsState.NOT_LOGIN);
        }
        // 检查用户是否具有管理员角色
        if (!StpUtil.hasRole(SecurityRole.ROLE_ADMIN)) {
            throw new GenericException(PermissionsState.PERMISSION_NOT_ENOUGH);
        }
        tGroupsService.updateTGroups(tGroups);
        return Result.success( "修改小组成功");
    }

    /**
     * 删除小组
     */
	@DeleteMapping("/{groupIDs}")
    @Operation(summary = "管理员删除小组", description = "管理员删除小组")
    public Result<Object> remove(@PathVariable Long[] groupIDs)
    {
        log.info("管理员删除小组，参数为：{}", groupIDs);
        // 检查用户是否已登录
        if (!StpUtil.isLogin()) {
            throw new UnauthorizedException(PermissionsState.NOT_LOGIN);
        }
        // 检查用户是否具有管理员角色
        if (!StpUtil.hasRole(SecurityRole.ROLE_ADMIN)) {
            throw new GenericException(PermissionsState.PERMISSION_NOT_ENOUGH);
        }
        tGroupsService.deleteTGroupsByGroupIDs(groupIDs);
        return Result.success( "删除小组成功");
    }

    @GetMapping("/MessageList")
    @Operation(summary = "查询个人小组列表", description = "查询个人小组列表")
    public Result<Object> getMessageList()
    {
        // 检查用户是否已登录
        if (!StpUtil.isLogin()) {
            throw new UnauthorizedException(PermissionsState.NOT_LOGIN);
        }
        log.info("查询个人小组列表{}", StpUtil.getLoginIdAsString());

        List<TGroups> list = tGroupsService.selectGroupsMessageList();
        return Result.success( "获取小组信息成功", list);
    }

    //查询班级小组列表
    @GetMapping("/ClassList")
    @Operation(summary = "查询班级小组列表", description = "查询班级小组列表")
    public Result<PageResultVO> getClassList()
    {
        // 检查用户是否已登录
        if (!StpUtil.isLogin()) {
            throw new UnauthorizedException(PermissionsState.NOT_LOGIN);
        }
        log.info("查询班级小组列表{}", StpUtil.getLoginIdAsString());
        ClassInfo isDefault = classinfoMapper.selectClassinfoByIsDefault(1);
        PageResultVO list = tGroupsService.selectTGroupsListByClassId(isDefault);
        return Result.success( "获取小组信息成功",list);
    }
}
